package 计算器;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.time.LocalTime;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.swing.*;

public class MyTest extends JFrame implements ActionListener{
	//定义俩个面板
	private JPanel north,center;
	//定义一个文本框用于显示计算结果
	private JTextField field;
	//定义按钮
	private JButton[] btns;
	//按钮文字数组
	private String[] str;
	//计算引擎
	private ScriptEngine engine;
	public MyTest(){//构造函数无参
		//设置窗口的标题
		setTitle("计算器");
		//设置窗口大小 宽 高
		setSize(700,700);
		//关闭窗口时结束程序
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		//设置窗口的位置
		setLocation((int)(Toolkit.getDefaultToolkit().getScreenSize().getWidth()-this.getWidth())/2,
				(int) ((Toolkit.getDefaultToolkit().getScreenSize().getHeight()-this.getHeight())/2));
		//初始化窗口
		initComponent();
		//设置窗口可见
		setVisible(true);
		//窗口中添加内容
	}
	
	//初始化窗口的方法
	//无参、无返回值
private void initComponent() {
		//窗口 添加内容
	    //创建面板
	 north=new JPanel();
	 center=new JPanel();
	 //创建文本框
	 field=new JTextField();
	 field.setBackground(Color.cyan);
	 //设置文本框属性
	 //field.setColumns()
	 //设置宽高属性
		field.setPreferredSize(new Dimension(700,80));
		//输入框禁止编辑
		field.setEditable(false);
		//设置字体格式
		Font font=new Font("SanSerif",Font.BOLD,25);
	//设置字体、加粗、大小
		field.setFont(font);
		//field.setFont(new Font("SanSerif",Font.BOLD,25));
		//以数组的形式声明的一个按钮
		str=new String[]{
			"7","8","9","+","sin",
			"4","5","6","-","cos",
			"1","2","3","×","tan",
			"0",".","=","÷",")",
			"C","B","T","S","√",
			};
		//创建按钮
		btns=new JButton[str.length];
		for(int i=0;i<btns.length;i++){
			btns[i]=new JButton(str[i]);
			btns[i].setFont(new Font("SanSerif",Font.BOLD,25));
			btns[i].setBackground(Color.orange);
		};
		//给按键添加事件监听
		for (int i=0;i<btns.length;i++){
			btns[i].addActionListener(this);
			
		}
		//获取javaScript引擎
		ScriptEngineManager manger=new ScriptEngineManager();
		engine=manger.getEngineByName("javascript");
		//设置布局
		north.setLayout(new BorderLayout());
		//设置按钮面板的布局
		center.setLayout(new GridLayout(5,5));
		//将文本框添加到上面的面板
		north.add(field);
		//将btn添加到center面板
		for(int i=0;i<btns.length;i++){
			center.add(btns[i]);
		}
		//将面板添加到窗口中
		this.add(north,BorderLayout.NORTH);
		this.add(center);
	}
//将按键上的文字显示到输入框
public void showBtnText(String text){
//	System.out.println(text);
//	//判断text是不是数字
//	//正则表达式检测text是不是单个数字
//	Boolean isNum=text.matches("\\d");
//	if(isNum){
//		//如果是数字，就拼接到字符串上
//		//输入框上已有的文字
//		//输入框上的文字怎么累加
//		String oldText=field.getText();
//		field.setText(oldText+text);
//		
//	}else{
		//如果不是数字，就特殊处理
		//System.out.println(text);
		if("C".equals(text)){
			//清除输入框
			field.setText("");
		}else if("B".equals(text)){
			//删除最后一位
			//当前文本框内容
			if(field.getText().length()>0){
				//先获取输入框的内容，然后截取掉最后一位，将截取后的内容重新设置到输入框
			field.setText(field.getText().substring(0,field.getText().length()-1));
			}
		}else if("T".equals(text)){
			boolean isTimeDisplayOn = false;
			//显示时间
			  if (!isTimeDisplayOn) { // 只有当不显示时才更新时间
	                field.setText("当前时间是: " + LocalTime.now());
	                isTimeDisplayOn = true; // 设置为显示状态
			  }
		}else if("S".equals(text)){
			//关闭时间显示
			 field.setText(""); // 清空显示，或根据需求调整
		}else if("=".equals(text)){
			try{
			//获得计算的内容
			String txt=field.getText();
			System.out.println(txt);
			txt=txt.replaceAll("×", "*").replaceAll("÷", "/");
			//使用计算引擎计算结果
			System.out.println(txt);
			Object o=engine.eval(txt);
			//计算输入框中的内容
			//将o转换为字符串
			field.setText(o+"");
		}catch(Exception e){
			e.printStackTrace();
		}
		}else if ("√".equals(text)) {
			//根号的计算
		field.setText(field.getText() + "Math.sqrt(");
		}
		else if("sin".equals(text)){
			//计算sin
		field.setText(field.getText() + "Math.sin(");
		}
		else if("cos".equals(text)){
			//计算cos
			field.setText(field.getText() + "Math.cos(");
		}
		else if("tan".equals(text)){
			field.setText(field.getText() + "Math.tan(");
		}
		else if (")".equals(text)) {
		    // 当用户输入")"，检查之前是否有未完成的函数调用，并自动补全
		    String currentText = field.getText();
		    if (currentText.contains("Math.sqrt(") || currentText.contains("Math.sin(") || currentText.contains("Math.cos(")) {
		        field.setText(currentText + ")");
		    } else {
		        field.setText(currentText + text); // 如果没有函数调用，正常添加括号
		    }
		}
		else{
			//数字 . 和运算符
			String oldText=field.getText();
			field.setText(oldText+text);
		}
		//如果是运算符
		//保留已输入的数字
//		String oldNum=field.getText();
//		System.out.println(oldNum);
//		//清空输入区
//		field.setText(text);
	}	
     //重写方法按钮添加到文本框
    @Override
    public void actionPerformed(ActionEvent e) {
	    // 输出捕获到的Action
	    //System.out.println(e.getSource());
	    Object source=e.getSource();
	if(source instanceof JButton){
		JButton btn=(JButton) source;
		//获取按键的文字
		//System.out.println(btn);
		String text=btn.getText();
		//System.out.println(text);
		// 播放点击音效
        playClickSound();
		//展示文字到文本框
		this.showBtnText(text);
		//field.setText(text);
		//输入框上的文字到输入框上
	}
}
    private void playClickSound() {
        try {
            // 替换为你的音效文件路径
            File soundFile = new File("music/音效2.wav");
            //获取音频输入流
            AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(soundFile);
            //获取音频剪辑对象
            Clip clip = AudioSystem.getClip();
            //打开音频剪辑并设置音频输入流
            clip.open(audioInputStream);
            //开始播放音频
            clip.start();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

	//定义一个游戏开始
	public static void main(String[] args){
		//System.out.println("hello word");
		new MyTest();//创建实例
	}
	
}
